package com.gitee.liuzhi.framework.starter.utils;

import org.apache.commons.lang3.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by 2022/4/29/0029
 *
 * @author LiuZhi
 * @version V1.0
 * @description: 脱敏工具类
 */
public class SensitiveUtils {

    /**
     * 手机号脱敏
     * <p>
     * 脱敏规则：
     * 1、保留该字段前后4个字符内容，中间部分脱敏：1388****4942
     * 2、手机号位数没有做限制：1-4字符：直接显示；4-8字符：1388****
     *
     * @param mobile
     * @return
     */
    public static String mobile(String mobile) {
        if (StringUtils.isNotEmpty(mobile)) {
            return mobile.length() > 8 ? mobile.replaceAll("(\\w{4})\\w*(\\w{4})", "$1****$2") : mobile.length() <= 4 ? mobile : mobile.replaceAll("(\\w{4})\\w*", "$1****");
        }
        return mobile;
    }

    /**
     * 银行卡脱敏
     * 保留该字段前后4个字符内容，中间部分脱敏
     * 1-4字符直接显示
     * 5-8字符脱敏  *
     * @param bank
     * @return
     */
    public static String bankCard(String bank) {
        // 银行账号保留前六后四
        if (StringUtils.isNotEmpty(bank)) {
            if (bank.length() <= 4) {
                return bank;
            } else if (bank.length() > 8) {
                String regex = "(\\w{4})(.*)(\\w{4})";
                Matcher m = Pattern.compile(regex).matcher(bank);
                if (m.find()) {
                    String rep = m.group(2);
                    StringBuilder sb = new StringBuilder();
                    //可控制隐藏字符* 个数
                    for (int i = 0; i < (Math.min(rep.length(), 4)); i++) {
                        sb.append("*");
                    }
                    bank = bank.replaceAll(rep, sb.toString());
                }
            } else {
                return bank.replaceAll("(\\w{4})\\w*", "$1****");
            }

        }
        return bank;
    }

    /**
     * 姓名脱敏
     * 保留该字段前后1个汉字或字符内容，中间部分脱敏为 *
     * 1个汉字或字符直接显示
     * 2个汉字或字符最后一个字符脱敏为 *
     *
     * @param name
     * @return
     */
    public static String userName(String name) {
        if (StringUtils.isNotEmpty(name)) {
            if (name.length() > 2) {
                return name.replaceAll(name.substring(1, name.length() - 1), "*");
            } else if (name.length() == 2) {
                return name.replaceAll(name.substring(1), "*");
            }
            return name;
        }
        return name;
    }

    /**
     * 客户名称脱敏
     * 保留该字段前后2个汉字或字符内容，中间部分脱敏为 *
     * 1-2个汉字或字符直接显示
     * 3-4个汉字或字符保留2个字符后面部分脱敏 *
     *
     * @return
     */
    public static String customerName(String name) {
        if (StringUtils.isNotEmpty(name)) {
            if (name.length() <= 2) {
                return name;
            } else if (name.length() <= 4) {
                return name.replaceAll(name.substring(2), "**");
            } else {
                return name.replaceAll(name.substring(2, name.length() - 2), "****");
            }
        }
        return name;
    }

}
